#include <iostream>
#include <algorithm>
#include <semaphore.h>
#include <functional>
#include <unistd.h>
#include <condition_variable>
#include <mutex>

class Bank
{
public:
    Bank() : _per_cnt(0)
    {
        // 初始化信号量
        sem_init(&_seat, 0, 10);
        sem_init(&_machine, 0, 1);
    }

    // 进门 信号量为0
    void enbank() {
        // 是否有位置
        sem_wait(&_seat);
        // 叫号机
        sem_wait(&_machine);
        // 获取完号
        sem_post(&_machine);

        // 访问临界资源
        std::unique_lock<std::mutex> lock(_mtx);
        _per_cnt++;
        lock.unlock();
        _num.notify_one();   // 通知bankService

        // 等待叫号获取服务

        sleep(1);

        // 获取完服务
        sem_post(&_seat);

    }

    void bankService()
    {
        while(true) 
        {
            std::unique_lock<std::mutex> lock(_mtx);
            _num.wait(lock, [this]{ return _per_cnt > 0; });  // 等待数据可用

            // 提供服务
            sleep(1);
        }
    }

    ~Bank() {
        // 销毁信号量
        sem_destroy(&_seat);
        sem_destroy(&_machine);
    }
private:
    sem_t _seat;
    sem_t _machine;
    std::mutex _mtx;
    std::condition_variable _num;
    int _per_cnt;
};


int main()
{

    return 0;
}